const path = require('path');
const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const logger = require('morgan');

const port = 3000 ;
const app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

/* - - - - 启用解析cookie的中间件 - - - - - - - - -  */
app.use( cookieParser() );
/* - - - - 启用处理会话的中间件 - - - - - - - - - -  */
let options = {
  name: 'KFMID',
  secret: 'kaifamiao',
  resave: false,
  saveUninitialized: true,
  cookie: { 
    secure: false , 
    path: '/' 
  }
}
// 创建用于处理会话的中间件
let sessionMiddleware= session( options );
app.use( sessionMiddleware );
/* - - - - - - - - - - - - - - - - - - - - - - - -  */

app.get( '/' , (req,resp)=>{
  resp.redirect( '/index.html' );
});

app.post( '/login' , (req,resp)=>{

  // 这里的 user 相当于从数据库中查询到的数据
  const user = {
    id: 100200300,
    username: 'laowang' ,
    password: 'hello' ,
    nickname: '隔壁老王'
  }

  // 解构 req.body 对象
  let { username , password } = req.body ;
  if( username === user.username && password === user.password){
    /* - - - - - - - - - - 准予登录 - - - - - - - - - - */
    // 1、获得与当前请求关联的会话对象
    const session = req.session ;
    console.log( 'session: ' , session );
    // 2、将用户信息添加到会话对象中
    session.user = user ;
    // 3、向客户端返回 ( 可能是重定向 也可能是向客户端发送 HTML 或 JSON 等数据 )
    resp.redirect( `/main`);
    return ;
  }
  resp.send( `<div>用户名或密码错误</div><a href="/index.html">返回</a>` );
});

app.get( '/main' , (req,resp)=>{

  // 尝试获得从客户端传回的 cookie 数据
  console.log( req.cookies );

  // 1、获得与当前请求关联的会话对象
  const session = req.session ;
  // 2、判断用户是否已经登录
  if( session.user ) {
    let content = `<div>${ session.user.nickname }</div>`;
    content += `<div><a href="/logout">退出</a></div>`;
    resp.send( content );
    return ;
  }
  resp.send( `<div>请先<a href="/index.html">登录</a></div>` );
});

app.get( '/logout' , (req,resp)=>{
  // 获得当前请求关联的会话对象
  const session = req.session ;
  // 从会话对象中删除 user 属性
  delete session.user ;
  // 重定向到 首页
  resp.redirect( '/index.html' );
});

app.listen( port );